package com.sparkflow.mysqlbinlog.clickhousesync.core.mapper;

import java.util.HashMap;
import java.util.Map;

/**
 * MySQL到ClickHouse类型映射器
 * 负责将MySQL数据类型转换为ClickHouse对应的数据类型
 *
 * @author Mr_xiaoZH
 * @date 2025-07-23
 */
public class MySQLToClickHouseTypeMapper {
    private static final Map<String, String> TYPE_MAP = new HashMap<>();
    static {
        // 基础数值类型
        TYPE_MAP.put("TINYINT", "Int8");
        TYPE_MAP.put("TINYINT UNSIGNED", "UInt8");
        TYPE_MAP.put("SMALLINT", "Int16");
        TYPE_MAP.put("SMALLINT UNSIGNED", "UInt16");
        TYPE_MAP.put("MEDIUMINT", "Int32");
        TYPE_MAP.put("MEDIUMINT UNSIGNED", "UInt32");
        TYPE_MAP.put("INT", "Int32");
        TYPE_MAP.put("INT UNSIGNED", "UInt32");
        TYPE_MAP.put("BIGINT", "Int64");
        TYPE_MAP.put("BIGINT UNSIGNED", "UInt64");
        // 浮点类型
        TYPE_MAP.put("FLOAT", "Float32");
        TYPE_MAP.put("DOUBLE", "Float64");
        // 日期时间类型（使用 DateTime64 避免溢出）
        TYPE_MAP.put("DATE", "Date");
        TYPE_MAP.put("DATETIME", "DateTime64(3, 'Asia/Shanghai')");
        TYPE_MAP.put("DATETIME(6)", "DateTime64(6, 'Asia/Shanghai')");
        TYPE_MAP.put("TIMESTAMP", "DateTime64(0, 'Asia/Shanghai')");
        TYPE_MAP.put("TIME", "String");  // ClickHouse 无 TIME 类型，建议存为 String 或用 Interval（复杂）
        // 字符串类型
        TYPE_MAP.put("CHAR", "String");
        TYPE_MAP.put("VARCHAR", "String");
        TYPE_MAP.put("TEXT", "String");
        TYPE_MAP.put("LONGTEXT", "String");
        TYPE_MAP.put("TINYTEXT", "String");
        TYPE_MAP.put("MEDIUMTEXT", "String");
        // 二进制与大对象
        TYPE_MAP.put("BLOB", "String");  // 可选：使用 LowCardinality(String) 或 Nullable(String)
        TYPE_MAP.put("LONGBLOB", "String");
        TYPE_MAP.put("VARBINARY", "String");
        TYPE_MAP.put("BINARY", "String");
        // 数值精度类型
        TYPE_MAP.put("DECIMAL", "Decimal(38, 10)");  // 更高精度
        TYPE_MAP.put("DECIMAL(10,2)", "Decimal(10, 2)");
        TYPE_MAP.put("DECIMAL(18,4)", "Decimal(18, 4)");
        // 布尔类型
        TYPE_MAP.put("BOOLEAN", "UInt8");  // 0 or 1
        TYPE_MAP.put("BOOL", "UInt8");
        // 枚举与集合
        TYPE_MAP.put("ENUM", "String");  // ClickHouse 无 ENUM 类型
        TYPE_MAP.put("SET", "String");   // 存储为逗号分隔字符串
        // JSON 类型
        TYPE_MAP.put("JSON", "String");  // ClickHouse 无 JSON 类型，建议存为 String
        // 位字段
        TYPE_MAP.put("BIT", "UInt64");  // BIT(1~64) 映射为 UInt64
        // 地理空间类型（MySQL 8.0+）
        TYPE_MAP.put("GEOMETRY", "String");
        TYPE_MAP.put("POINT", "String");
        TYPE_MAP.put("LINESTRING", "String");
        TYPE_MAP.put("POLYGON", "String");
        // 其他类型
        TYPE_MAP.put("YEAR", "UInt16");
        TYPE_MAP.put("UUID", "String");
    }

    public static String map(String mysqlType) {
        return TYPE_MAP.getOrDefault(mysqlType.toUpperCase(), "String");
    }
}
